
package me.sealer.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

import java.util.Map;

/**
 * Json与bean处理的工具类
 *
 * @author sealer
 * @ClassName: NewJsonBeanUtil
 * @Description: Json与bean处理的工具类
 * @date 2018年8月19日
 */
public class NewJsonBeanUtil {

    /**
     * bean 2 bean 转换
     *
     * @param s   原 bean
     * @param <S> 原bean泛型
     * @param <T> 目标bean泛型
     * @return 转换后的bean对象
     */
    public static <S, T> T bean2Bean(S s, Class<T> clazz) {
        JSON json = (JSON) JSON.toJSON(s);
        T t = JSON.toJavaObject(json, clazz);
        return t;
    }

    /**
     * @param clazz 需要转换成的类型
     * @param <T>   泛型
     * @return 转换后的java对象
     */
    public static <T> T jsonStr2Bean(String jsonObjectStr, Class<T> clazz) {
        JSONObject jsonObject = jsonStr2JsonObject(jsonObjectStr);
        return jsonObject.toJavaObject(clazz);
    }

    /**
     * 获取context中的content中的Body， 并转换为Request
     *
     * @param content content， 其中包括Head和Body两个子节点
     * @param clazz   Request的类型
     * @param <T>     泛型 request
     * @return 转换后的对象
     */
    public static <T> T getPeRestRequest(String content, Class<T> clazz) {
        JSONObject jsonObject = getSubJsonObjectNode(content, "Body");
        return jsonObject2Bean(jsonObject, clazz);
    }

    /**
     * 获取json 字符串的子节点
     *
     * @param parentJsonStr 父json字符串
     * @param key           json串的子节点
     * @return 子节点的JSONObject对象
     */
    public static JSONObject getSubJsonObjectNode(String parentJsonStr, String key) {
        JSONObject parentJsonObject = jsonStr2JsonObject(parentJsonStr);
        return parentJsonObject.getJSONObject(key);
    }

    /**
     * @param clazz 需要转换成的类型
     * @param <T>   泛型
     * @return 转换后的java对象
     */
    public static <T> T jsonObject2Bean(JSONObject jsonObject, Class<T> clazz) {
        return jsonObject.toJavaObject(clazz);
    }

    /**
     * 将map转换成指定的bean对象
     *
     * @param map   源map, 字段大小写须和目标class一致
     * @param clazz 目标对象的class
     * @param <T>   待转换的目标类泛型
     * @return 转换完成的目标类
     */
    public static <T> T map2Bean(Map map, Class<T> clazz) {
        String s = JSON.toJSONString(map);
        return jsonStr2Bean(s, clazz);
    }


    /**
     * str 2 JsonObject
     *
     * @param jsonStr json str
     * @return 转换后的JsonObject
     */
    public static JSONObject jsonStr2JsonObject(String jsonStr) {
        JSONObject jsonObject = JSON.parseObject(jsonStr);
        return jsonObject;
    }
}
